package com.platform.dto;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.platform.comm.constraints.CImport;
import com.platform.comm.validation.groups.Batch;
import com.platform.comm.validation.groups.Insert;
import com.platform.comm.validation.groups.Modify;
import com.platform.enums.CommFlagType;
import com.platform.validator.UnifiedCode;
import com.platform.comm.dto.BaseQo;
import com.platform.comm.enums.YnEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Description: 组织信息-DTO
 *
 * @author libin Created on 2019/7/18
 **/
@EqualsAndHashCode(callSuper = true)
@Data
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class DepartQo extends BaseQo {
    private static final long serialVersionUID = -2824001993858504215L;
    /**
     * 组织名称
     */
    @NotBlank(message = "组织名称不能为空", groups = {Insert.class, Batch.class, Modify.class})
    @Size(max = 30, message = "组织名称长度不能超过30个字符", groups = {Insert.class, Batch.class, Modify.class})
    @CImport(name = "组织名称")
    private String departName;

    /**
     * 父组织ID
     */
    @NotEmpty(message = "所属组织不能为空", groups = {Batch.class})
    @CImport(name = "所属组织")
    private String parentId;

    /**
     * 父组织名称
     */
    private String parentName;

    /**
     * 组织类型
     */
    @Size(max = 10, message = "组织类型长度不能超过10个字符", groups = {Insert.class, Batch.class})
    @NotEmpty(message = "组织类型不能为空", groups = {Insert.class, Batch.class})
    @CImport(name = "组织类型")
    private String departKind;

    /**
     * 统一社会信用代码
     */
    @Pattern(regexp = "[a-zA-Z0-9]{18}", message = "统一社会信用代码长度必须为18位字符")
    @UnifiedCode(message = "必须为合法的统一社会信用代码", groups = Batch.class)
    @CImport(name = "统一社会信用代码")
    private String unifiedCode;

    /**
     * 组织编码
     */
//    @JsonIgnore
    @Size(max = 128, message = "组织编码长度不能超过128个字符")
    @NotEmpty(message = "组织编码不能为空")
    private String departCode;

    /**
     * 组织全称
     */
    @Size(max = 360, message = "组织全称长度不能超过360个字符", groups = {Insert.class, Batch.class})
    @CImport(name = "组织全称")
    private String fullName;

    /**
     * 名称路由
     */
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @Size(max = 1024, message = "名称路由长度不能超过1024个字符")
    private String routeName;

    /**
     * 编码路由
     */
    @JsonProperty(access = JsonProperty.Access.READ_WRITE)
    @Size(max = 512, message = "编码路由长度不能超过512个字符")
    private String routeCode;

    /**
     * 组织层级
     */
    @Min(0)
    private Integer level;

    /**
     * 所属管理域
     */
    @JsonIgnore
    @Size(max = 36, message = "所属管理域长度不能超过36个字符")
    private String domain;

    /**
     * 行政区划代码
     */
    @Size(max = 128, message = "行政区划代码长度不能超过128个字符")
    private String regionId;

    /**
     * 行政区划名称
     */
    private String regionName;

    /**
     * 状态标志
     */
    @Pattern(regexp = "[01YN]", message = "信息状态值不合法")
    private YnEnum delFlag;

    /**
     * 排序编号
     */
    private Integer sortNum;

    /**
     * 统一编码
     */
    private String bizCode;

    /**
     * 机构类型
     */
    private String orgType;

    /**
     * 信息来源
     */
    private String infoSource;

    /**
     * 同步状态
     */
    private String syncStatus;

    /**
     * 联系电话
     */
    private String tel;

    /**
     * 备注
     */
    @Size(max = 512, message = "备注长度不能超过512个字符")
    private String remark;

    /**
     * 批量导入ID
     */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String importId;

    /**
     * 批量导入状态
     */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String importCheckFlag;

    /**
     * 批量导入错误信息
     */
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private String checkErrMsg;

    /**
     * 状态
     */
    @Size(max = 3)
    @Pattern(regexp = "[IYDLP]", message = "状态值不匹配")
    private CommFlagType status;

    /**
     *  组织领导用户编码
     */
    private String leaderId;

    /**
     *  组织领导用户名称
     */
    private String leaderName;

    /**
     *  子部门数据
     */
    private List<DepartQo> children;

    /**
     * 用户列表
     */
    private List<UserDetail> userList;

    /**
     * 资源数
     */
    private Long resourceCount;

    public List<DepartQo> getChildren() {
        if(children == null) {
            children = new ArrayList<>();
        }
        return children;
    }

    @Override
    public void init() {
        super.init();
        this.setDelFlag(YnEnum.N);
        this.setStatus(CommFlagType.Enabled);
        if (this.getSortNum() == null) {
            this.setSortNum(0);
        }
    }
}
